﻿#include "FileDialogDirectory.h"
#include "ui_FileDialogDirectory.h"

#include "OperatorsInterface/ParaWidgetInterfaceOperator.h"

#include <QDebug>
#include <QDesktopServices>
#include <QStandardItemModel>
#include <QDir>
#include <QCollator>
//QDirModel
#include <QDesktopServices>
#include <QStandardItemModel>

namespace GUI
{
    const QString FileDialogDirectory::fatherNodeText = "FileName"; //根节点名称
    const QString FileDialogDirectory::splitExt = "@";    //用于文件头类型分割符，如12@dat

    FileDialogDirectory::FileDialogDirectory(EventOper::ParaWidgetInterfaceOperator* oper, QWidget *parent)
        : GUIDialogBase(oper, "FileDialogDirectory", parent)
    {
        _ui = new Ui::FileDialogDirectory;
        _ui->setupUi(this);

        //ini ui
        initUi();

        //
        connect(_ui->OKChoice, SIGNAL(clicked()), this, SLOT(onOkClicked()));
        connect(_ui->Cancel, SIGNAL(clicked()), this, SLOT(onCancelClicked()));
        connect(_ui->back, SIGNAL(clicked()), this, SLOT(onBackClicked()), Qt::UniqueConnection);
        connect(_ui->front, SIGNAL(clicked()), this, SLOT(onFrontClicked()), Qt::UniqueConnection);
        connect(_ui->up, SIGNAL(clicked()), this, SLOT(onUpPushButtonClicked()));
        connect(_ui->FileType, SIGNAL(currentIndexChanged(QString)), this, SLOT(onFilterChange(QString)));
        //
        connect(_ui->PathTree, SIGNAL(doubleClicked(const QModelIndex)), this, SLOT(pathTreeViewDoubleClick(const QModelIndex)));
        //
        _fileTree = _ui->FileTree;
        _fileTree->setSelectionMode(QAbstractItemView::SingleSelection); // 仅限单选
        _fileTree->setSelectionBehavior(QAbstractItemView::SelectRows);
        connect(_fileTree, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(onDoubleClickedObject(QTreeWidgetItem*, int)));
        connect(_fileTree, SIGNAL(itemSelectionChanged()), this, SLOT(onItemSelectionChanged()));

        QStringList names;
        names << FileDialogDirectory::fatherNodeText;
        _builtinItem = new QTreeWidgetItem(_fileTree, names);

        //set path
        _docPath = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
        _deskTopPath = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
        userName = "";
        rootName = "";
#ifdef Q_OS_UNIX
        userPath = QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
        rootPath = "/";
        userName = userPath.section("/", -1, -1);
        rootName = "Computer";
#endif

        SetDirectoryForDrives();

        // ini path
        _currentFilePath = _ui->FilePath->text();
        _currentIndex = _dirModel->index(_currentFilePath);

        //
        filterChange(_ui->FileType->currentText());
        refreshRightView();
    }

    FileDialogDirectory::~FileDialogDirectory()
    {
        _fileTree->clear();
        _pathBackVec.clear();
        _pathFrontVec.clear();
    }

    void FileDialogDirectory::initUi()
    {
        //ini combox
        _ui->FilePath->setReadOnly(true);

        _currentFilePath = QDir::cleanPath(qApp->applicationDirPath());
        _treeWidgetFilename = _currentFilePath;
        _ui->FilePath->setText(_currentFilePath);

        //ini button icons
        QIcon iconBack;
        iconBack.addFile(QString::fromUtf8(":/icons/back.png"));
        QIcon iconFront;
        iconFront.addFile(QString::fromUtf8(":/icons/front.png"));
        QIcon iconUp;
        iconUp.addFile(QString::fromUtf8(":/icons/up.png"));
        _ui->back->setIcon(iconBack);
        _ui->front->setIcon(iconFront);
        _ui->up->setIcon(iconUp);

        _ui->back->setEnabled(false);
        _ui->front->setEnabled(false);

        //ini spliter
        _ui->splitter->setStretchFactor(0, 3);
        _ui->splitter->setStretchFactor(1, 7);
    }

    void FileDialogDirectory::BuildFilePathTree()
    {
        _fileTree->clear();
        QStringList names;
        names << FileDialogDirectory::fatherNodeText;
        _builtinItem = new QTreeWidgetItem(_fileTree, names);
        QTreeWidgetItem* parentItem = _builtinItem;
        QMap<QString, QVector<QString>>::iterator it;
        for (it = _fileGroup.begin(); it != _fileGroup.end(); it++)
        {
            QString FilePath = it.key();
            QVector<QString> FileNames = it.value();
            QTreeWidgetItem *itm = new QTreeWidgetItem(_fileTree);
            itm->setText(0, FilePath);
            itm->setData(0, Qt::UserRole + 1, "Group");
            if (FileNames.count() > 1)
            {
                parentItem->addChild(itm);
                for (int j = 0; j < FileNames.count(); j++)
                {
                    QTreeWidgetItem *itmchild = new QTreeWidgetItem(itm);
                    itmchild->setText(0, FileNames[j]);
                    itmchild->setData(0, Qt::UserRole + 1, "Child");
                    itm->addChild(itmchild);
                }
            }
        }
    }


    void FileDialogDirectory::initWin(QString dirStr)
    {
        if (dirStr.isEmpty()) return;

        QDir dir(dirStr);
        if (!dir.exists()) return;

        _ui->FilePath->setText(dirStr);
        filterChange(_ui->FileType->currentText());
        refreshRightView();
        _currentIndex = _dirModel->index(dirStr);
        _treeWidgetFilename = dirStr;
    }

    QString FileDialogDirectory::appendSlash(QString curPath)
    {
        int index = curPath.lastIndexOf("/", curPath.size());
        if ((index <= 0) && (curPath.size() > 3))
        {
            curPath = curPath + "/";
        }
        return curPath;
    }

    void FileDialogDirectory::openFilePath(bool recordHistory)
    {
        // 前进后退不记录历史路径信息，正常打开文件记录文件信息并添加"\"后缀
        if (recordHistory)
        {
            QString strPath = _currentFilePath;
            if (strPath.right(1) == "/")
            {
                strPath = _currentFilePath.mid(0, _currentFilePath.length() - 1);
            }
            _pathBackVec.push_back(strPath);
            _ui->back->setEnabled(true);
        }

        _currentFilePath = _treeWidgetFilename;
        _ui->FilePath->setText(_currentFilePath);


        if (!_currentFilePath.isEmpty())
        {
            _ui->FileName->setText("");
            filterChange(_ui->FileType->currentText());
        }
    }

    QString FileDialogDirectory::GetFileExt(QString fileName)
    {
        QFileInfo fileInfo;
        fileInfo = QFileInfo(fileName);
        return fileInfo.suffix();
    }

    QStringList FileDialogDirectory::GetFilterFromString(const QString& filter)
    {
        QString f = filter;
        int start, end;
        start = filter.indexOf('(');
        end = filter.lastIndexOf(')');
        if (start != -1 && end != -1)
        {
            f = f.mid(start + 1, end - start - 1);
        }
        else if (start != -1 || end != -1)
        {
            f = QString();
        }
        QStringList fs = f.split(QRegExp("[\\s+;]"), QString::SkipEmptyParts);

        return fs;
    }

    void FileDialogDirectory::onDoubleClickedObject(QTreeWidgetItem* pitem, int column)
    {
        QString name = pitem->text(column);

        int rowNum = 0;
#ifdef Q_OS_WIN
        while (true)
        {
            QModelIndex index = _currentIndex.child(rowNum, 0);
            if (!index.isValid())
            {
                //error
                return;
            }
            if (index.data() == name)
            {
                int dotIndex = name.lastIndexOf(".");
                QString fileExt = name.mid(dotIndex, name.length() - dotIndex);
                // 包含在当前过滤文件类型中即可
                if (_ui->FileType->currentText().indexOf(fileExt) != -1)
                {
                    break;
                }
                func_PathTreeViewDoubleClick(index);
                return;
            }
            rowNum++;
        }
#endif
#ifdef Q_OS_UNIX
        while (true)
        {
            QString fileExt = name.right(name.indexOf("."));
            if (_ui->FileType->currentText().indexOf(fileExt) != -1)
            {
                break;
            }
            unix_PathTreeViewDoubleClick(name);
            return;
            rowNum++;
        }
#endif
        _ui->OKChoice->click();
    }


    void FileDialogDirectory::onFilterChange(QString filter)
    {
        _filterList.clear();
        _filterList = GetFilterFromString(filter);

        enterDirectory();

        refreshRightView();
    }

    void FileDialogDirectory::filterChange(QString filter)
    {
        _filterList.clear();
        _filterList = GetFilterFromString(filter);

        enterDirectory();
    }

    void FileDialogDirectory::GetFileList(QString dirName)
    {
        _fileList.clear();

        QFileInfo fileInfo;
        QString filePath;

        fileInfo = QFileInfo(dirName);
        filePath = fileInfo.absolutePath();
        QDir dir(dirName);
        if (!dir.exists())
            return;
        dir.setFilter(QDir::Files | QDir::NoDotAndDotDot); //QDir::Dirs;
        dir.setSorting(QDir::Name);

        dir.setNameFilters(_filterList);
        QFileInfoList list = dir.entryInfoList();
        if (list.count() > 0)
        {
            for (int i = 0; i < list.count(); i++)
            {
                _fileList.push_back(list.at(i).fileName());
            }
        }

        //对文件进行大小排序
        QCollator collator;
        collator.setNumericMode(true);
        std::sort(_fileList.begin(), _fileList.end(),
            [&collator](const QString & str1, const QString & str2)
        {
            return collator.compare(str1, str2) < 0;
        });
    }

    QString FileDialogDirectory::getCurrentFullPath()
    {
        return _currentFilePath + _selectionText;
    }

    bool FileDialogDirectory::isGourpFiles(const QString path)
    {
        if (path.indexOf("...") > 0)
        {
            return true;
        }
        return false;
    }

    void FileDialogDirectory::iniFileFilterType(QString filterString)
    {
        _ui->FileType->insertItem(0, filterString);
        _ui->FileType->setCurrentIndex(0);
    }

    void FileDialogDirectory::onCancelClicked()
    {
        close();
    }

    void FileDialogDirectory::onOkClicked()
    {
        if (_selectionText.isEmpty()) return;

        // 暂时解决 C:/Users/Administrator/Desktop/valve.cgns/valve.cgns
        // 路径中文件名字重复的问题
        QString f = _currentFilePath + _selectionText;
        QStringList fs = f.split(QRegExp("[/]"), QString::SkipEmptyParts);
        if (fs[fs.count() - 1] == fs[fs.count() - 2])
        {
            QString path = _currentFilePath.mid(0, _currentFilePath.size() - 1);
            int index = path.lastIndexOf("/");
            _currentFilePath = path.left(index + 1);
        }

        //执行操作器
        if (_oper) {
            _oper->setArgs("filePath", _currentFilePath);
            _oper->setArgs("files", getCurrentFullPath());
            _oper->execProfession();
        }
        accept();
    }

    void FileDialogDirectory::enterDirectory()
    {
        QString tempFileHeader;
        _currentFilePath = _ui->FilePath->text().trimmed();


        if (_currentFilePath.right(1) != "/")
            _currentFilePath += "/";

        GetFileList(_currentFilePath);

        _fileGroup.clear();
        _headFile.reserve(_fileList.count() * 2);
        _headFile.clear();
        for (int i = 0; i < _fileList.count(); i++)
        {
            QString fileName = _fileList.at(i);
            QString fileExt = GetFileExt(fileName);
            QString fileHead, fileHeadExt;
            int endPos = fileName.length() - fileExt.length() - 2, beginPos;
            for (beginPos = endPos; beginPos >= 0; --beginPos) {
                if (fileName[beginPos] > '9' || fileName[beginPos] < '0') break;
            }
            fileHead = fileName.mid(0, beginPos + 1);
            fileHeadExt = fileHead + FileDialogDirectory::splitExt + fileExt;
            if (_headFile.contains(fileHeadExt) == false)
            {
                _headFile.insert(fileHeadExt, 1);
            }
            else
            {
                _headFile[fileHeadExt] += 1;
            }
        }

        QString headExt, headFront;
        QMap<QString, int>::iterator it;
        for (int i = 0; i < _fileList.count(); i++)
        {
            QString fileName = _fileList.at(i);
            QString fileExt = GetFileExt(fileName);
            QString fileHead, fileHeadExt, NodeText;
            int endPos = fileName.length() - fileExt.length() - 2;
            int beginPos;
            for (beginPos = endPos; beginPos >= 0; --beginPos) {
                if (fileName[beginPos] > '9' || fileName[beginPos] < '0') break;
            }
            fileHead = fileName.mid(0, beginPos + 1);
            fileHeadExt = fileHead + FileDialogDirectory::splitExt + fileExt;
            if (_headFile[fileHeadExt] > 1)
            {
                NodeText = fileHead + "..." + fileExt;
            }
            else
            {
                NodeText = fileName;
            }
            if (_fileGroup.contains(NodeText) == false)
                _fileGroup.insert(NodeText, QVector<QString>());
            _fileGroup[NodeText].push_back(fileName);
        }
        BuildFilePathTree();
    }

    void FileDialogDirectory::SetDirectoryForDrives()
    {
        QStandardItemModel* tep_model = new QStandardItemModel;

#ifdef Q_OS_WIN

        _dirModel = new QDirModel;

        QStringList pathTreeHead;
        pathTreeHead.append("Disk List");
        tep_model->setHorizontalHeaderLabels(pathTreeHead);

        _dirModel->setSorting(QDir::DirsFirst | QDir::IgnoreCase | QDir::Name);
        _dirModel->setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);

        int num_row = _dirModel->rowCount(QModelIndex());

        tep_model->appendRow(new QStandardItem(tr("DeskTop")));
        tep_model->appendRow(new QStandardItem(tr("My Documents")));


        for (int i = 0; i < num_row; i++)
        {
            tep_model->appendRow(new QStandardItem(_dirModel->index(i, 0).data().toString()));
        }

#endif
#ifdef Q_OS_UNIX
        _dirModel = new QDirModel;
        _dirModel->setSorting(QDir::DirsFirst | QDir::IgnoreCase | QDir::Name);
        _dirModel->setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);

        QString userPath = QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
        QString userName = userPath.section("/", -1, -1);
        tep_model->appendRow(new QStandardItem(rootName));
        tep_model->appendRow(new QStandardItem(userName));

#endif 
        _ui->PathTree->setModel(tep_model);
        _ui->PathTree->setAnimated(true);
        _ui->PathTree->setIndentation(20);
        _ui->PathTree->setSortingEnabled(false);
        //_ui->PathTree->header()->hide();
        _ui->PathTree->hideColumn(1);
        _ui->PathTree->hideColumn(2);
        _ui->PathTree->hideColumn(3);

        _ui->PathTree->setItemsExpandable(false);
        _ui->PathTree->resizeColumnToContents(0);
        _ui->PathTree->setEditTriggers(QAbstractItemView::EditTrigger::NoEditTriggers);
        _ui->PathTree->show();
    }

    void FileDialogDirectory::onItemSelectionChanged()
    {
        QList<QTreeWidgetItem*> selectItems = _fileTree->selectedItems();

        if (selectItems.count() > 0)
        {
            _selectionText = "";
        }

        for (int i = 0; i < selectItems.count(); i++)
        {
            QTreeWidgetItem *curitem = selectItems.at(i);
            if (curitem->text(0).contains("FileName"))
            {
                continue;
            }

            if (i == selectItems.size() - 1)
            {
                _selectionText += curitem->text(0);
            }
            else
            {
                _selectionText += curitem->text(0);
                _selectionText += ";";
            }
        }

        _ui->FileName->setText(_selectionText);
    }

    void FileDialogDirectory::func_PathTreeViewDoubleClick(const QModelIndex& index)
    {
        _currentIndex = index;

        if ((index.data().toString() == ".") | (index.data().toString() == ".."))
            return;

        _treeWidgetFilename = FindFullFilename(index);

        if (_treeWidgetFilename.indexOf("C:") != -1)
        {
            if (-1 == _treeWidgetFilename.indexOf("/", 1))
            {
                _treeWidgetFilename = "C:";
            }
            else
                _treeWidgetFilename.replace(0, _treeWidgetFilename.indexOf("/", 1), "C:");
        }
        else if (_treeWidgetFilename.indexOf("D:") != -1)
        {
            if (-1 == _treeWidgetFilename.indexOf("/", 1))
            {
                _treeWidgetFilename = "D:";
            }
            else
                _treeWidgetFilename.replace(0, _treeWidgetFilename.indexOf("/", 1), "D:");
        }
        else if (_treeWidgetFilename.indexOf("E:") != -1)
        {
            if (-1 == _treeWidgetFilename.indexOf("/", 1))
            {
                _treeWidgetFilename = "E:";
            }
            else
                _treeWidgetFilename.replace(0, _treeWidgetFilename.indexOf("/", 1), "E:");
        }
        else if (_treeWidgetFilename.indexOf("F:") != -1)
        {
            if (-1 == _treeWidgetFilename.indexOf("/", 1))
            {
                _treeWidgetFilename = "F:";
            }
            else
                _treeWidgetFilename.replace(0, _treeWidgetFilename.indexOf("/", 1), "F:");
        }
        else if (_treeWidgetFilename.indexOf("G:") != -1)
        {
            if (-1 == _treeWidgetFilename.indexOf("/", 1))
            {
                _treeWidgetFilename = "G:";
            }
            else
                _treeWidgetFilename.replace(0, _treeWidgetFilename.indexOf("/", 1), "G:");
        }
        else if (_treeWidgetFilename.indexOf("H:") != -1)
        {
            if (-1 == _treeWidgetFilename.indexOf("/", 1))
            {
                _treeWidgetFilename = "H:";
            }
            else
                _treeWidgetFilename.replace(0, _treeWidgetFilename.indexOf("/", 1), "H:");
        }
        else if (_treeWidgetFilename.indexOf("I:") != -1)
        {
            if (-1 == _treeWidgetFilename.indexOf("/", 1))
            {
                _treeWidgetFilename = "I:";
            }
            else
                _treeWidgetFilename.replace(0, _treeWidgetFilename.indexOf("/", 1), "I:");
        }
        else if (_treeWidgetFilename.indexOf(tr("DeskTop")) >= 0)
        {
            _treeWidgetFilename = _deskTopPath;
        }
        else if (_treeWidgetFilename.indexOf(tr("My Documents")) >= 0)
        {
            _treeWidgetFilename = _docPath;
        }
        else return;

        openFilePath(true);
        refreshRightView();
    }

    void FileDialogDirectory::unix_PathTreeViewDoubleClick(QString itemName)
    {
        _treeWidgetFilename = _ui->FilePath->text();
        if (_treeWidgetFilename != "/")
            _treeWidgetFilename += "/";
        _treeWidgetFilename += itemName;
        openFilePath(true);

        refreshRightView();
    }

    void FileDialogDirectory::pathTreeViewDoubleClick(const QModelIndex& index)
    {
#ifdef Q_OS_WIN

        QString cur_name = index.data().toString();
        if ((cur_name == tr("DeskTop")) || (cur_name == tr("My Documents")))
        {
            _treeWidgetFilename = cur_name;
            if (cur_name == tr("DeskTop"))
                _currentIndex = _dirModel->index(_deskTopPath);
            else
                _currentIndex = _dirModel->index(_docPath);
        }
        else
        {
            int i;
            for (i = 0; i < _dirModel->rowCount(QModelIndex()); i++)
            {
                if (_dirModel->index(i, 0).data().toString() == index.data().toString())
                {
                    _currentIndex = _dirModel->index(i, 0);
                    break;
                }
            }
            if (i == _dirModel->rowCount(QModelIndex()))
                return;

            qDebug() << index.parent().data().toString() << endl;

            if ((index.data().toString() == ".") | (index.data().toString() == ".."))
                return;

            _treeWidgetFilename = FindFullFilename(index);
        }

        if (_treeWidgetFilename.indexOf("C:") != -1)
        {
            if (-1 == _treeWidgetFilename.indexOf("/", 1))
            {
                _treeWidgetFilename = "C:";
            }
            else
                _treeWidgetFilename.replace(0, _treeWidgetFilename.indexOf("/", 1), "C:");
        }
        else if (_treeWidgetFilename.indexOf("D:") != -1)
        {
            if (-1 == _treeWidgetFilename.indexOf("/", 1))
            {
                _treeWidgetFilename = "D:";
            }
            else
                _treeWidgetFilename.replace(0, _treeWidgetFilename.indexOf("/", 1), "D:");
        }
        else if (_treeWidgetFilename.indexOf("E:") != -1)
        {
            if (-1 == _treeWidgetFilename.indexOf("/", 1))
            {
                _treeWidgetFilename = "E:";
            }
            else
                _treeWidgetFilename.replace(0, _treeWidgetFilename.indexOf("/", 1), "E:");
        }
        else if (_treeWidgetFilename.indexOf("F:") != -1)
        {
            if (-1 == _treeWidgetFilename.indexOf("/", 1))
            {
                _treeWidgetFilename = "F:";
            }
            else
                _treeWidgetFilename.replace(0, _treeWidgetFilename.indexOf("/", 1), "F:");
        }
        else if (_treeWidgetFilename.indexOf("G:") != -1)
        {
            if (-1 == _treeWidgetFilename.indexOf("/", 1))
            {
                _treeWidgetFilename = "G:";
            }
            else
                _treeWidgetFilename.replace(0, _treeWidgetFilename.indexOf("/", 1), "G:");
        }
        else if (_treeWidgetFilename.indexOf("H:") != -1)
        {
            if (-1 == _treeWidgetFilename.indexOf("/", 1))
            {
                _treeWidgetFilename = "H:";
            }
            else
                _treeWidgetFilename.replace(0, _treeWidgetFilename.indexOf("/", 1), "H:");
        }
        else if (_treeWidgetFilename.indexOf("I:") != -1)
        {
            if (-1 == _treeWidgetFilename.indexOf("/", 1))
            {
                _treeWidgetFilename = "I:";
            }
            else
                _treeWidgetFilename.replace(0, _treeWidgetFilename.indexOf("/", 1), "I:");
        }
        else if (_treeWidgetFilename.indexOf(tr("DeskTop")) >= 0)
        {
            _treeWidgetFilename = _deskTopPath;
        }
        else if (_treeWidgetFilename.indexOf(tr("My Documents")) >= 0)
        {
            _treeWidgetFilename = _docPath;
        }
        else return;

        openFilePath(true);

#endif
#ifdef Q_OS_UNIX

        QString cur_name = index.data().toString();
        if ((cur_name == rootName) || (cur_name == userName))
        {
            _treeWidgetFilename = cur_name;
        }


        if (_treeWidgetFilename == rootName)
        {
            _treeWidgetFilename = rootPath;
        }
        else if (_treeWidgetFilename == userName)
        {
            _treeWidgetFilename = userPath;
        }
        else return;
        qDebug() << _treeWidgetFilename << endl;

        openFilePath(true);

#endif
        refreshRightView();
    }

    QString FileDialogDirectory::FindFullFilename(const QModelIndex& index)
    {
        if (index.data().toString() == NULL) return NULL;
        return FindFullFilename(index.parent()) + "/" + index.data().toString();
    }

    void FileDialogDirectory::refreshRightView()
    {
        QDir dir(_currentFilePath);
        dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);

        QFileInfoList list = dir.entryInfoList();

        QStyle* style = QApplication::style();
        QIcon icon = style->standardIcon(QStyle::SP_DirIcon);
        for (int iCnt = 0; iCnt < list.size(); ++iCnt)
        {
            QTreeWidgetItem * item = new QTreeWidgetItem(_fileTree);
            item->setText(0, list.at(list.size() - 1 - iCnt).fileName());
            item->setIcon(0, icon);
            _fileTree->addTopLevelItem(item);
        }
    }

    void FileDialogDirectory::onUpPushButtonClicked()
    {
#ifdef Q_OS_WIN
        if (_currentIndex.parent().isValid())
        {
            _currentIndex = _currentIndex.parent();
            QDir dir(_treeWidgetFilename);
            if (dir.cdUp())
            {
                _treeWidgetFilename = dir.absolutePath();
                openFilePath(true);
                refreshRightView();
            }
        }
#endif
#ifdef Q_OS_UNIX
        QString str = _ui->FilePath->text();
        QStringList tepList = str.split("/", QString::SkipEmptyParts);
        if (tepList.count() >= 1)
        {
            QDir dir(_treeWidgetFilename);
            if (dir.cdUp())
            {
                _treeWidgetFilename = dir.absolutePath();
                openFilePath(true);
                refreshRightView();
            }
        }
#endif
    }

    void FileDialogDirectory::onBackClicked()
    {
        if (_pathBackVec.size() > 0)
        {
            QString strPath;
            if (_currentFilePath.right(1) == "/")
            {
                strPath = _currentFilePath.mid(0, _currentFilePath.length() - 1);
            }
            _pathFrontVec.push_back(strPath); //前进列表新增
            _ui->front->setEnabled(true);   //前进键可用

            _currentFilePath = _pathBackVec.back();
            _pathBackVec.pop_back();     //后退列表更新

            if (_pathBackVec.size() == 0)
            {
                _ui->back->setEnabled(false);   //后退键不可用
            }

            _currentIndex = _dirModel->index(_currentFilePath);;
            QDir dir(_treeWidgetFilename);
            if (dir.cd(_currentFilePath))
            {
                _treeWidgetFilename = _currentFilePath;
                openFilePath(false);
                refreshRightView();
            }
        }
    }

    void FileDialogDirectory::onFrontClicked()
    {
        if (_pathFrontVec.size() > 0)
        {
            QString strPath;
            if (_currentFilePath.right(1) == "/")
            {
                strPath = _currentFilePath.mid(0, _currentFilePath.length() - 1);
            }
            _pathBackVec.push_back(strPath);  //后退列表新增
            _ui->back->setEnabled(true);   //后退键可用

            _currentFilePath = _pathFrontVec.back();
            _pathFrontVec.pop_back();     //前进列表更新

            if (_pathFrontVec.size() == 0)
            {
                _ui->front->setEnabled(false); //前进键不可用
            }
            _currentIndex = _dirModel->index(_currentFilePath);;
            QDir dir(_treeWidgetFilename);
            if (dir.cd(_currentFilePath))
            {
                _treeWidgetFilename = _currentFilePath;
                openFilePath(false);
                refreshRightView();
            }
        }

    }
}